home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / gnu / djgpp / src / libgplus.5 / libgplus / etc / adt-exam / generic-.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-17  |  3.6 KB  |  104 lines

  1. // From: "Douglas C. Schmidt" <schmidt@glacier.ics.uci.edu>
  2. // Date: Sun, 25 Sep 88 16:19:35 -0700
  3.  
  4. #include <stream.h>
  5. #include <ctype.h>
  6. #include <String.h>
  7. #include <generic.h>
  8. #include <stdlib.h>
  9.  
  10. #define queue(type) name2(type,queue)
  11. #define list(type) name2(type,list)
  12. #define queuedeclare(type)                     \
  13. class queue(type) {                            \
  14.    struct list(type) {                         \
  15.       type item;                               \
  16.       list(type) *next;                        \
  17.    } *head;                                    \
  18.    int sz;                                     \
  19. public:                                        \
  20.    queue(type)(void) {head = 0;sz = 0;}        \
  21.    ~queue(type)(void) {                        \
  22.       list(type) *temp;                        \
  23.       while (head) {                           \
  24.          temp = head;                          \
  25.          head = head->next;                    \
  26.          delete temp;                          \
  27.       }                                        \
  28.    }                                           \
  29.    int  empty(void) {return(!head);}           \
  30.    int  size(void) {return(sz);}               \
  31.    void enqueue(type new_item);                \
  32.    type front(void) {                          \
  33.       return(head->next->item);                \
  34.    }                                           \
  35.    type dequeue(void);                         \
  36. };
  37.  
  38. #define queueimplement(type)                   \
  39. type queue(type)::dequeue(void) {              \
  40.    if (!head)                                  \
  41.       abort();                                 \
  42.    type temp = head->next->item;               \
  43.    list(type) *temp_ptr;                       \
  44.    if ((temp_ptr = head->next) == head) {      \
  45.       head = 0;                                \
  46.    }                                           \
  47.    else {                                      \
  48.       head->next = temp_ptr->next;             \
  49.    }                                           \
  50.    delete temp_ptr;                            \
  51.    sz--;                                       \
  52.    return(temp);                               \
  53. }                                              \
  54. void queue(type)::enqueue(type new_item) {     \
  55.    if (!head) {                                \
  56.       head       = new list(type);             \
  57.       head->item = new_item;                   \
  58.       head->next = head;                       \
  59.    }                                           \
  60.    else {                                      \
  61.       list(type) *temp_node  = new list(type); \
  62.       temp_node->item  = new_item;             \
  63.       temp_node->next  = head->next;           \
  64.       head->next       = temp_node;            \
  65.       head             = temp_node;            \
  66.    }                                           \
  67.    sz++;                                       \
  68. }                                              \ 
  69.  
  70.  
  71. queuedeclare(String);
  72. queueimplement(String);
  73. queuedeclare(double);
  74. queueimplement(double);
  75.  
  76. main() {
  77.    String Buf;
  78.    queue(String) Q_String;
  79.    queue(double) Q_double;
  80.  
  81.    while (cin >> Buf) {
  82.       if (Buf.matches(RXalpha)) {
  83.          Q_String.enqueue(String(Buf));
  84.       }
  85.       else if (Buf.matches(RXdouble)) {
  86.          Q_double.enqueue(atof(Buf));
  87.       }   
  88.    }
  89.  
  90.    while (!Q_String.empty()) {
  91.       cout << "Size = " << Q_String.size() << ",Item = " 
  92.            << Q_String.front() << "\n";
  93.       void(Q_String.dequeue());
  94.    }
  95.  
  96.    while (!Q_double.empty()) {
  97.       cout << "Size = " << Q_double.size() << ",Item = " 
  98.            << Q_double.front() << "\n";
  99.       void(Q_double.dequeue());
  100.    }
  101.    return (0);
  102. }
  103.  
  104.